home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / gfx / opal / render.lha / Renderer.c < prev    next >
C/C++ Source or Header  |  1993-01-07  |  4KB  |  188 lines

  1. #include <proto/all.h>
  2. #include <opal/opallib.h>
  3. #include <graphics/gfxbase.h>
  4. #include <exec/memory.h>
  5.  
  6.  
  7. /* Typical interface to OpalVision from a rendering package
  8.  */
  9.  
  10.  
  11. /* Define this flag if you want to open a Virtual screen if
  12.  * chip ram is running low.
  13.  */
  14.  
  15. #define OPENVIRTUAL    1
  16.  
  17. /* Define this flag if you cannot set the LSB of bit of
  18.  * the background colour.
  19.  */
  20.  
  21. #define AUTOSYNC    1
  22.  
  23.     /* external functions */
  24.  
  25. BOOL Open_OpalScreen (ULONG Modes);
  26. void Render_To_Opal (long Y, long Width, long Lines,
  27.             UBYTE *Red, UBYTE *Green, UBYTE *Blue, BOOL Chunky);
  28. void Opal_Render_Finished (void);
  29. void Close_Opal (void);
  30.  
  31.  
  32.  
  33. extern struct GfxBase *GfxBase;
  34. static struct OpalBase *OpalBase;
  35. static struct OpalScreen *OScrn,*VScrn;
  36. static long LastUpdateY,UpdateLines;
  37.  
  38.  
  39. /*   Open the Opalvision screen. Modes must be any combination of
  40.  * HIRES24,ILACE24,OVERSCAN24 as defined in Opallib.h.
  41.  *   The screen will be opened in chip ram if possible. If there
  42.  * is not enough chip ram, a virtual screen will be opened.
  43.  */
  44.  
  45.  
  46. BOOL Open_OpalScreen (ULONG Modes)
  47. {
  48.    long ImageSize;
  49.    long Width,Height;
  50.  
  51.     if (OpalBase==NULL)
  52.         OpalBase = (struct OpalBase *)OpenLibrary ("opal.library",0);
  53.     if (OpalBase==NULL) return (FALSE);
  54.  
  55.         /* Calculate the amount of memory required for the screen */
  56.  
  57.     if (GfxBase->DisplayFlags & NTSC)
  58.         { if (Modes & OVERSCAN24)
  59.             { if (Modes & ILACE24)
  60.                 Height = 476;
  61.               else
  62.                 Height = 238;
  63.             }
  64.           else
  65.             { if (Modes & ILACE24)
  66.                 Height = 400;
  67.               else
  68.                 Height = 200;
  69.             }
  70.         }
  71.      else
  72.         { if (Modes & OVERSCAN24)
  73.             { if (Modes & ILACE24)
  74.                 Height = 576;
  75.               else
  76.                 Height = 286;
  77.             }
  78.           else
  79.             { if (Modes & ILACE24)
  80.                 Height = 512;
  81.               else
  82.                 Height = 256;
  83.             }
  84.         }
  85.  
  86.  
  87.     if (Modes & OVERSCAN24)
  88.         { if (Modes & HIRES24)
  89.             Width = 736L;
  90.           else
  91.             Width = 368L;
  92.         }
  93.     else
  94.         { if (Modes & HIRES24)
  95.             Width = 640L;
  96.           else
  97.             Width = 320L;
  98.         }
  99.  
  100.     if (Modes & PLANES8)
  101.         ImageSize = Width*Height;
  102.     else if (Modes & PLANES15)
  103.         ImageSize = Width*Height*2L;
  104.     else
  105.         ImageSize = Width*Height*3L;
  106.  
  107. #ifdef OPENVIRTUAL
  108.  
  109.     if (AvailMem (MEMF_CHIP)<ImageSize)
  110.         { VScrn = CreateScreen24 (Modes,Width,Height);
  111.           if (VScrn==NULL) return (FALSE);
  112.           LastUpdateY = 0;
  113.           if (Modes & ILACE24)
  114.             UpdateLines = 32;
  115.           else
  116.             UpdateLines = 16;
  117.         }
  118.     else
  119. #endif
  120.         { OScrn = OpenScreen24 (Modes);
  121.           if (OScrn==NULL) return (FALSE);
  122. #ifdef AUTOSYNC
  123.           AutoSync24 (TRUE);
  124.           UpdateDelay24 (0);
  125. #else
  126.           UpdateDelay24 (10);
  127. #endif
  128.         }
  129.     return (TRUE);
  130. }
  131.  
  132. /* Render image RGB data to the OpalVision FrameBuffer.
  133.  *
  134.  * Inputs:
  135.  *    Y         = Staring Y-position (line) to place data.
  136.  *    Width         = Width of the RGB data.
  137.  *    Lines         = Number of scan lines to render.
  138.  *    Red,Green,Blue    = Pointers to Red, Green and Blue byte planes.
  139.  *    Chunky        = Set to TRUE if RGB data is in chunky (interleaved)
  140.  *              format.
  141.  */
  142.  
  143.  
  144. void Render_To_Opal (long Y, long Width, long Lines,
  145.             UBYTE *Red, UBYTE *Green, UBYTE *Blue, BOOL Chunky)
  146. {
  147.    UBYTE *RGBPlanes[3];
  148.    struct OpalScreen *WriteScreen;
  149.  
  150.     RGBPlanes[0] = Red;
  151.     RGBPlanes[1] = Green;
  152.     RGBPlanes[2] = Blue;
  153.     if (VScrn)
  154.         WriteScreen = VScrn;
  155.     else
  156.         WriteScreen = OScrn;
  157.     if (WriteScreen==NULL) return;
  158.     if (Chunky)
  159.         RGBtoOV (WriteScreen,RGBPlanes,0,Y,3*Width,Lines);
  160.     else
  161.         RGBtoOV (WriteScreen,RGBPlanes,0,Y,Width,Lines);
  162.     if (VScrn)
  163.         { if ((LastUpdateY/UpdateLines) != (Y/UpdateLines))
  164.             { OScrn = LowMemUpdate24 (VScrn,0);
  165.               LastUpdateY = Y;
  166.             }
  167.         }
  168. }
  169.  
  170. void Opal_Render_Finished (void)
  171. {
  172.     if (VScrn)
  173.         OScrn = LowMemUpdate24 (VScrn,0);
  174. }
  175.     
  176.  
  177. void Close_Opal (void)
  178. {
  179.     if (OScrn)
  180.         CloseScreen24();
  181.     if (VScrn)
  182.         FreeScreen24 (VScrn);
  183.     if (OpalBase) CloseLibrary ((struct Library *)OpalBase);
  184.     OScrn = NULL;
  185.     VScrn = NULL;
  186.     OpalBase = NULL;
  187. }
  188.